#!/usr/bin/python
# coding: utf-8

'''
Created on 18 Set, 2009

@author: Javier Rivera
'''

from PyQt4 import QtCore, QtGui
import sys, decimal, tempfile, os

from Ui_Main import Ui_MainWindow

MotivosDevolucion={'0':u'Importe a cero',
                   '1':u'Incorriente',
                   '2':u'No domiciliado o cuenta cancelada',
                   '3':u'Oficina domiciliataria inexistente',
                   '4':u'Aplicación R.D. 338/90, sobre el NIF',
                   '5':u'Por orden del cliente: error o baja en la domiciliación',
                   '6':u'Por orden del cliente: disconformidad con el importe',
                   '7':u'Adeudo duplicado, indebido, erroneo o faltan datos',
                   '8':u'Sin utilizar'}

class Devolucion :
    individuales=[]

class VentanaPrincipal(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        # Set up the user interface from Designer.
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.printer=QtGui.QPrinter()
        self.connect(self.ui.actionCargar, QtCore.SIGNAL("triggered()"),self.seleccionar_archivo)
        self.connect(self.ui.actionImprimir, QtCore.SIGNAL("triggered()"), self.imprimir)
        # TODO: Probar en Windows.
        # TODO: Empaquetar para windows. pyexe?
        self.devolucion=Devolucion()
    def seleccionar_archivo(self):
        """Ensina unha pantalla de seleccion de archivo"""
        ficheiro=QtGui.QFileDialog.getOpenFileName(self,"Seleccionar fichero","","Todos (*.*)")
        if ficheiro!="" :
            self.cargar(ficheiro)
    def cargar(self,archivo):
        """Carga un archivo no visor"""
        try:
            fich=open(archivo,"r")
        except:
            QtGui.QErrorMessage(self).showMessage("No puedo cargar el fichero %s" % archivo)
        else:
            for campo in fich:
                if campo[:4]=="5190" :
                    # Primera campo,Cabecera del presentador
                    self.devolucion.NifEmpresa=campo[4:13]
                    self.devolucion.FechaFichero=campo[16:22]
                    self.devolucion.NombreEmpres=campo[28:68]
                    self.devolucion.Presentador=campo[108:148]
                elif campo[:4]=="5390" :
                    # campo 2, Cabecera del ordenante
                    self.devolucion.FechaCargo=campo[22:28]
                    self.devolucion.CuentaCargo="%s/%s/%s/%s" % (campo[68:72],campo[72:76], campo[76:78], campo[78:88])
                elif campo[:4]=="5690" :
                    # campo individual
                    novoIndividuo={}
                    novoIndividuo['Nif']=campo[4:13]
                    novoIndividuo['Nombre']=campo[28:68]
                    novoIndividuo['Entidad']="%s/%s/%s/%s" % (campo[68:72],campo[72:76], campo[76:78], campo[78:88])
                    novoIndividuo['Importe']=decimal.Decimal(campo[88:96] + "." + campo[96:98])
                    #novoIndividuo['Importe']=campo[88:96] + "." + campo[96:98]
                    novoIndividuo['Concepto']=campo[114:154]
                    novoIndividuo['Motivo']=MotivosDevolucion[campo[154]]
                    self.devolucion.individuales.append(novoIndividuo)
                elif campo[:4]=="5890" :
                    # Total por ordenante
                    self.devolucion.Total=decimal.Decimal(campo[88:96] + "." + campo[96:98])
                    # self.devolucion.Total=campo[88:96] + "." + campo[96:98]
            self.renderizar()
    def renderizar(self):
        self.ui.editEmpresa.setText(self.devolucion.NombreEmpres)
        self.ui.editNif.setText(self.devolucion.NifEmpresa)
        self.ui.editFechaCargo.setText(self.devolucion.FechaCargo)
        self.ui.editPresentador.setText(self.devolucion.Presentador)
        self.ui.editFechaFichero.setText(self.devolucion.FechaFichero)
        self.ui.editCuenta.setText(self.devolucion.CuentaCargo)
        self.ui.editTotal.setText(str(self.devolucion.Total))
        self.ui.tabla.setRowCount(0)
        for ficha in self.devolucion.individuales :
            fila=self.ui.tabla.rowCount()
            self.ui.tabla.insertRow(fila)
            self.ui.tabla.setItem(fila,0,QtGui.QTableWidgetItem(ficha['Nif']))
            self.ui.tabla.setItem(fila,1,QtGui.QTableWidgetItem(ficha['Nombre']))
            self.ui.tabla.setItem(fila,2,QtGui.QTableWidgetItem(ficha['Entidad']))
            self.ui.tabla.setItem(fila,3,QtGui.QTableWidgetItem(str(ficha['Importe'])))
            self.ui.tabla.setItem(fila,4,QtGui.QTableWidgetItem(ficha['Concepto']))
            self.ui.tabla.setItem(fila,5,QtGui.QTableWidgetItem(ficha['Motivo']))
    def imprimir(self):
        """Imprime el cuaderno que estamos viendo"""
        if len(self.devolucion.individuales)==0 :
            QtGui.QErrorMessage(self).showMessage("No hay nada que imprimir")
        else :
            dialogo=QtGui.QPrintDialog(self.printer,self)
            dialogo.addEnabledOption(dialogo.PrintToFile)
            if dialogo.exec_()==QtGui.QDialog.Accepted :
                p=QtGui.QPainter(self.printer)
                margenx=15
                margeny=20
                ancho=p.window().width()-margenx
                p.setFont(QtGui.QFont("courier",14))
                posv=margeny
                p.drawText(margenx+5,posv,"Devoluciones por modelo 19")
                p.setFont(QtGui.QFont("courier",8))
                fmetrics=p.fontMetrics()
                vem=fmetrics.lineSpacing()
                posv=posv+3*vem
                p.drawText(margenx,posv,"Empresa : %s" % self.devolucion.NombreEmpres)
                p.drawText(margenx+ancho*.5,posv,"Fecha de Cargo: %s" % self.devolucion.FechaCargo)
                posv=posv+3*vem
                p.drawText(margenx,posv,"Nif")
                p.drawText(margenx + ancho*.1,posv,"Nombre")
                p.drawText(margenx + ancho*.4,posv,"Entidad")
                p.drawText(margenx + ancho*.7,posv,"Importe")
                p.drawText(margenx + ancho*.8,posv,"Concepto")
                p.drawText(margenx + ancho*.9,posv,"Motivo")
                posv=posv+1*vem +1
                p.drawLine(margenx,posv,ancho*.95,posv)
                for devolucion in self.devolucion.individuales :
                    posv=posv+vem
                    p.drawText(margenx,posv,devolucion['Nif'])
                    p.drawText(margenx + ancho*.1,posv,devolucion['Nombre'])
                    p.drawText(margenx + ancho*.4,posv,devolucion['Entidad'])
                    p.drawText(margenx + ancho*.7,posv,str(devolucion['Importe']))
                    p.drawText(margenx + ancho*.8,posv,devolucion['Concepto'])
                    p.drawText(margenx + ancho*.9,posv,devolucion['Motivo'])
                p.setFont(QtGui.QFont("courier",11))
                posv=posv+4*vem
                p.drawText(margenx+ancho*.15,posv,"TOTAL : %s" % self.devolucion.Total)

if __name__ == '__main__':
    # Main loop
    app = QtGui.QApplication(sys.argv)
    # Ventana principal
    Main = VentanaPrincipal()
    if len(sys.argv)>1 :
        Main.cargar(sys.argv[1])
    Main.show()
    # Iniciar loop
    sys.exit(app.exec_())
